<?php

/*
  --- PROJECT COFELY 2011, StatDeelname --
  @author: Leander Molegraaf
  @category: statistieken
  @name StatDeelname

  @uses StatGrafiek.php
  @see StatStatistiekRapport.php

  @version 1.2.3
  datum: 26-04-2012

  BESCHRIJVING:
  deze klasse is verantwoordelijk voor het grafiek: het verzameld de benodigde
  gegevens en roept uiteindelijk de library JPGraph aan.
  WERKING:
  Deze klasse wordt aangeroepen met 13 waardes:
  - de titel die boven de grafiek komt te staan
  - een boolean die bepaalt of de default legenda gebruikt wordt(aanwezig, afwezig en afwezig met reden)
  - een array met legenda's, deze is alleen nodig als de bovenstaande value op false staat (anders moet je een lege array meegeven)
  - de width van de image van de grafiek
  - de height van de image van de grafiek
  - de margins die de grafiek gebruikt tov de randen van de image (een string met 4 waardes gesplitst door een komma)
  - een boolean die aangeeft of de grafiek horizontale(true) balken heeft, of niet(false)
  - de database Klasse
  - de statistieksoort (WPI/TBM)
  - de maand van het begin van de periode
  - de jaar van het begin van de periode
  - de maand van het einde van de periode
  - de jaar van het einde van de periode


  OPMERKINGEN:
  1.1 Er wordt een al ingevulde DBklasse verwacht.
  1.2 opmerkingen betreffend de werking van de grafiek zijn te vinden in StatGrafiek.php

  CHANGELOG:
  1.2.1:
  - comments verbeterd
  - printRow verwijderd
  - calculatePercentage geeft niet langer een 'division by zero' als de totaalwaarde 0 is.
  - calculaterPercentage verkort

  1.2.2:
  - bestandsnamen van de statistiek beginnen allemaal met Stat
  - de grafiek gebruikt nu het aantal personen wat een voldoende aantal WPIs/TBMs heeft gevolgd, ipv het aantal WPIs/TBMs wat door alle gebruikers gevolgd is.

  1.2.3:
  - enkele namen verduidelijkt
  - ontwerp geupdate
 */
require_once 'defs/Constants.php';

class StatDeelname {

    private $defaultlegenda = false, $horizontaal = true; //bool
    private $graphheight = 400, $graphWidth = 580; //int
    private $imgLocation = STAT_DEELNAME_IMGLOCATION, $margins = STAT_DEELNAME_MARGINS, $title; //String
    private $legendasArray, $PCNaam; //array met strings
    private $aantalGevolgd = array(), $aantalGemist = array(), $aantalGemistMetReden = array(), $aantalOperationeel; //array met integers

    /**
     * constructor
     * @param String $title de titel die bovenaan de grafiek komt te staan
     * @param bool $defaultLegenda true betekend dat er een default legenda wordt gebruikt ipv. de legenda uit de volgende argument
     * @param Stringarray $legendasArray een array met legenda's, 1 voor elke PC/BU/AD
     * @param int $graphWidth de width van de uiteindelijke image
     * @param int $graphHeight de height van de uiteindelijke image
     * @param String $margins vier margins, gescheiden met een komma
     * @param bool $horizontaal true betekend dat de balken horizontaal staan, anders verticaal
     * @param StatStatistiekenRapport $statistiekDB de databaseklassen
     * @param String $statistiekSoort welke type statistiek dit is (WPI/TBM)
     * @param int $beginFilterPeriodeMaand de maand vanaf wanneer gefilterd moet worden
     * @param int $beginFilterPeriodeJaar de jaar vanaf wanneer gefilterd moet worden
     * @param int $eindFilterPeriodeMaand
     * @param int $eindFilterPeriodeJaar
     * 
     * @since Version 1.0
     */

    public function __construct($title, $defaultLegenda, $legendasArray, $graphWidth, $graphHeight, $margins, $horizontaal, $statistiekDB, $statistiekSoort, $beginFilterPeriodeMaand, $beginFilterPeriodeJaar, $eindFilterPeriodeMaand, $eindFilterPeriodeJaar) {
        $PC = $statistiekDB->getLijstMetBedrijfsonderdelen();
        $loop = 0;
        if (count($PC) == 0) {
            echo(STAT_ERROR_GEEN_PROFITCENTERS);
        }
        for ($nummer = 0; $nummer < count($PC); $nummer++) {
            $profitcenter = $statistiekDB->getSpecifiekeBedrijfsonderdeel($PC[$nummer]->getNaam(), $beginFilterPeriodeMaand, $beginFilterPeriodeJaar, $eindFilterPeriodeMaand, $eindFilterPeriodeJaar);
            if ($statistiekSoort == STAT_TOOLBOXMEETING) {
                $operationeel = $profitcenter->getOperationeel();
            } else {
                $operationeel = $profitcenter->getWPIPlichtig();
            }
            $this->PCNaam[$loop] = $profitcenter->getNaam();

            $this->aantalGoed[$nummer] = 0;
            $this->aantalSlecht[$nummer] = 0;
            $this->aantalFout[$nummer] = 0;

            for ($loop = 0; $loop < count($profitcenter->gebruikersLijst); $loop++) {
                switch ($profitcenter->gebruikersLijst[$loop]->getStatus()) {
                    case 1:
                        $this->aantalGoed[$nummer]++;
                        break;
                    case 2:
                        $this->aantalSlecht[$nummer]++;
                        break;
                    case 3:
                        $this->aantalFout[$nummer]++;
                        break;
                }
            }
            $aantalOperationeel[$loop] = $operationeel;
            $loop++;
        }

        $this->aantalOperationeel = $aantalOperationeel;
        $this->setTitle($title);
        $this->setDefaultLegenda($defaultLegenda);

        for ($nummer = 0; $nummer < count($legendasArray); $nummer++) {
            $this->legendasArray[$nummer] = $legendasArray[$nummer];
        }

        $this->graphWidth = $graphWidth;
        $this->graphHeight = $graphHeight;
        $this->margins = $margins;
        $this->horizontaal = $horizontaal;
    }

    public function getDefaultlegenda() {
        return $this->defaultlegenda;
    }

    public function setDefaultlegenda($defaultlegenda) {
        $this->defaultlegenda = $defaultlegenda;
    }

    public function getHorizontaal() {
        return $this->horizontaal;
    }

    public function setHorizontaal($horizontaal) {
        $this->horizontaal = $horizontaal;
    }

    public function getGraphheight() {
        return $this->graphheight;
    }

    public function setGraphheight($graphheight) {
        $this->graphheight = $graphheight;
    }

    public function getGraphWidth() {
        return $this->graphWidth;
    }

    public function setGraphWidth($graphWidth) {
        $this->graphWidth = $graphWidth;
    }

    public function getImgLocation() {
        return $this->imgLocation;
    }

    public function setImgLocation($imgLocation) {
        $this->imgLocation = $imgLocation;
    }

    public function getMargins() {
        return $this->margins;
    }

    public function setMargins($margins) {
        $this->margins = $margins;
    }

    public function getTitle() {
        return $this->title;
    }

    public function setTitle($title) {
        $this->title = $title;
    }

    public function getLegendasArray() {
        return $this->legendasArray;
    }

    public function setLegendasArray($legendasArray) {
        $this->legendasArray = $legendasArray;
    }

    public function getPCNaam() {
        return $this->PCNaam;
    }

    public function setPCNaam($PCNaam) {
        $this->PCNaam = $PCNaam;
    }

    public function getAantalGevolgd() {
        return $this->aantalGevolgd;
    }

    public function setAantalGevolgd($aantalGevolgd) {
        $this->aantalGevolgd = $aantalGevolgd;
    }

    public function getAantalGemist() {
        return $this->aantalGemist;
    }

    public function setAantalGemist($aantalGemist) {
        $this->aantalGemist = $aantalGemist;
    }

    public function getAantalGemistMetReden() {
        return $this->aantalGemistMetReden;
    }

    public function setAantalGemistMetReden($aantalGemistMetReden) {
        $this->aantalGemistMetReden = $aantalGemistMetReden;
    }

    public function getAantalOperationeel() {
        return $this->aantalOperationeel;
    }

    public function setAantalOperationeel($aantalOperationeel) {
        $this->aantalOperationeel = $aantalOperationeel;
    }

    /**
     * functie die de uiteindelijke link naar de grafiek samenstelt op basis van de gegevens die in de constructor zijn opgegeven.
     * @name generateDeelnameGrafiek
     * @returns String $link de image tag die de image weergeeft
     * @since 1.0
     */
    public function generateDeelnameGrafiek() {

        $link = STAT_DEELNAME_BEGIN . $this->getImgLocation() . STAT_DEELNAME_RAND . rand(1, 100);

        for ($nummer = 0; $nummer < count($this->PCNaam); $nummer++) {
            $totaal = $this->aantalGoed[$nummer] + $this->aantalSlecht[$nummer] + $this->aantalFout[$nummer];
            $arrayCount = $nummer + 1;
            $link = $link . STAT_DEELNAME_AANTALGOED . $arrayCount . "=" . $this->calculatePercentage($this->aantalGoed[$nummer], $totaal) . STAT_DEELNAME_AANTALSLECHT . $arrayCount . "=" . $this->calculatePercentage($this->aantalSlecht[$nummer], $totaal) . STAT_DEELNAME_AANTALFOUT . $arrayCount . "=" . $this->calculatePercentage($this->aantalFout[$nummer], $totaal) . STAT_DEELNAME_NAAM . $arrayCount . "=" . $this->PCNaam[$nummer] . STAT_DEELNAME_LEGENDA . $arrayCount . "=" . $this->legendasArray[$nummer];
        }
        $mexplode = explode(",", $this->margins);
        $link = $link . STAT_DEELNAME_TITLE . $this->getTitle() . STAT_DEELNAME_DEFLEGENDA . $this->getDefaultLegenda() . STAT_DEELNAME_WIDTH . $this->getGraphWidth() . STAT_DEELNAME_HEIGHT . $this->getGraphHeight() . STAT_DEELNAME_HORIZONTAAL . $this->getHorizontaal() . STAT_DEELNAME_MARGIN1 . $mexplode[0] . STAT_DEELNAME_MARGIN2 . $mexplode[1] . STAT_DEELNAME_MARGIN3 . $mexplode[2] . STAT_DEELNAME_MARGIN4 . $mexplode[3];
        echo $link . STAT_DEELNAME_EIND;
    }

    /**
     * berekend het percentage dat aantalVanTotaal is tov het totaal
     * @name calculatePercentage
     * @param int $cijferVanTotaal het kleinste getal
     * @param int $totaal het totaal 
     * @since Version 1.0
     * @return double $resultaat het resultaat, of 0.
     */
    private function calculatePercentage($cijfer, $totaal) { //int, int
        if ($cijfer > 0) {
            $calc = ($totaal / $cijfer) * 100;
            return(round($calc, 1, PHP_ROUND_HALF_DOWN));
        } else {
            return 0;
        }
    }

}

?>
